package team.bluepen.supermarket.constant;


import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.ParseException;
import java.util.IllegalFormatException;

/**
 * 定义错误代码
 * @author Kai
 */
public enum Error {
    /** 成功 */
    SUCCESS("00000"),
    /** 注册错误 */
    ERROR_REGISTER("A0100"),
    /** 用户已存在 */
    ERROR_USER_EXISTED("A0111"),
    /** 用户已登录 */
    ERROR_USER_ALREADY_LOGIN("A0112"),
    /** 用户不存在 */
    ERROR_USER_NOT_EXIST("A0201"),
    /** 密码错误 */
    ERROR_PASSWORD_NOT_CORRECT("A0210"),
    /**密码不合规，校验错误*/
    ERROR_PASSWORD_NON_COMPLIANCE("A0211"),
    /**用户名不合规*/
    ERROR_USERNAME_NON_COMPLIANCE("A0212"),
    /** 登陆状态过期 */
    ERROR_LOGIN_EXPIRED("A0311"),
    /** 请求次数过多 */
    ERROR_REQUEST_OVERRUN("A0501"),
    /** 上传文件错误 */
    ERROR_FILE_UPLOAD("A0700"),
    /** 上传文件类型错误 */
    ERROR_FILE_UNMATCHED("A0701"),
    /** 文件过大 */
    ERROR_FILE_OVERSIZE("A0702"),
    /** 文件已存在 */
    ERROR_FILE_EXISTED("A0703"),
    /** 文件未找到 */
    ERROR_FILE_NOT_FOUND("A0704"),
    /** 文件相关错误 */
    ERROR_FILE("A0705"),
    /** 运行错误 */
    ERROR_RUNTIME("B0001"),
    /** 运行超时 */
    ERROR_RUNTIME_OVERTIME("B0002"),
    /** 数据库错误 */
    ERROR_DATABASE("C0300"),
    /** 表不存在 */
    ERROR_TABLE_NOT_EXIST("C0311"),
    /** 列（列族）不存在 */
    ERROR_COLUMN_NOT_EXIST("C0312"),
    /** 表已存在 */
    ERROR_TABLE_EXISTED("C0313"),
    /** 列（列族）已存在 */
    ERROR_COLUMN_EXISTED("C0314"),
    /** 表已被禁用 */
    ERROR_TABLE_DISABLED("C0315"),
    /** 数据已存在 */
    ERROR_DATA_EXISTED("C0316"),
    /** 数据不存在 */
    ERROR_DATA_NOT_EXIST("C0317"),
    // 主要为适应Exception存在的，用于一一对应Exception，不再进行注释说明
    ERROR_ARRAY_OUT_BOUND("D0001"),
    ERROR_NULL("D0002"),
    ERROR_CLASS_CAST("D0003"),
    ERROR_ILLEGAL_ARGUMENT("D0004"),
    ERROR_ILLEGAL_STATE("D0005"),
    ERROR_PARSE("D0006"),
    ERROR_ILLEGAL_THREAD_STATE("D0007"),
    ERROR_ILLEGAL_ACCESS("D0008"),
    ERROR_ILLEGAL_FORMAT("D0009"),
    ERROR_IO("D0010"),
    /** 其他未归类错误 */
    ERROR_EXCEPTION("D0000");

    private final String value;

    Error(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    /**
     * 由{@link Error}获得布尔值状态
     * @return Error值成功为 {@code true}
     */
    public boolean getState(){
        return this == SUCCESS;
    }

    /**
     * 由布尔值获取 {@link Error}
     * @param state 状态
     * @return {@code true} 返回{@link #SUCCESS}， 否则只返回{@link #ERROR_EXCEPTION}
     */
    public static Error getErrorByBoolean(boolean state){
        if (state){
            return SUCCESS;
        }
        return ERROR_EXCEPTION;
    }

    /**
     * 由名称得到{@link Error}枚举类
     * @param error 错误码名称
     * @return {@link Error}枚举类
     */
    public static Error getErrorByName(String error) {
        for (Error e : values()) {
            if (e.name().equals(error)) {
                return e;
            }
        }
        return null;
    }

    /**
     * 由错误码得到{@link Error}枚举类
     * @param error 错误码
     * @return {@link Error}枚举类
     */
    public static Error getErrorByText(String error) {
        for (Error error_ : values()) {
            if (error_.value.equalsIgnoreCase(error)) {
                return error_;
            }
        }
        return null;
    }

    /**
     * 由{@link Exception}得到{@link Error}
     * @param exception {@link Exception}
     * @return {@link Error} 枚举类
     */
    public static Error getErrorFromException(Exception exception) {
        if (exception instanceof FileNotFoundException) {
            return Error.ERROR_FILE_NOT_FOUND;
        }
        if (exception instanceof IOException) {
            return Error.ERROR_IO;
        }
        if (exception instanceof NullPointerException) {
            return Error.ERROR_NULL;
        }
        if (exception instanceof ParseException) {
            return Error.ERROR_PARSE;
        }
        if (exception instanceof IllegalThreadStateException) {
            return Error.ERROR_ILLEGAL_THREAD_STATE;
        }
        if (exception instanceof IllegalAccessException) {
            return Error.ERROR_ILLEGAL_ACCESS;
        }
        if (exception instanceof IllegalFormatException) {
            return Error.ERROR_ILLEGAL_FORMAT;
        }
        if (exception instanceof IllegalArgumentException) {
            return Error.ERROR_ILLEGAL_ARGUMENT;
        }
        if (exception instanceof ClassCastException) {
            return Error.ERROR_CLASS_CAST;
        }
        if (exception instanceof IllegalStateException) {
            return Error.ERROR_ILLEGAL_STATE;
        }
        if (exception instanceof RuntimeException){
            return Error.ERROR_RUNTIME;
        }
        return Error.ERROR_EXCEPTION;
    }

    @Override
    public String toString() {
        if (this == Error.SUCCESS){
            return "SUCCESS";
        }
        return "Error: "+ this.name() + ", Error Code: " + value;
    }
}
